// 桶管理工具类
const BUCKET_STORAGE_KEY = 'my-noted-buckets';

// 定义桶数据结构接口
export interface BucketItem {
  id: string;       // 桶唯一ID
  name: string;     // 桶名称
  created: string;  // 创建时间
  updated: string;  // 更新时间
}

/**
 * 生成UUID
 * @returns UUID字符串
 */
function generateUUID(): string {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    const r = Math.random() * 16 | 0;
    const v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
}

/**
 * 获取所有桶信息
 * @returns 保存的桶列表
 */
export function getAllBuckets(): BucketItem[] {
  try {
    const bucketsJson = localStorage.getItem(BUCKET_STORAGE_KEY);
    if (!bucketsJson) return [];
    
    const data = JSON.parse(bucketsJson);
    
    // 处理旧格式数据（字符串数组）
    if (Array.isArray(data) && data.length > 0 && typeof data[0] === 'string') {
      migrateBucketData();
      return getAllBuckets();
    }
    
    return data;
  } catch (error) {
    console.error('获取桶信息失败:', error);
    return [];
  }
}

/**
 * 获取所有桶名称（兼容旧接口）
 * @returns 桶名称列表
 */
export function getAllBucketNames(): string[] {
  return getAllBuckets().map(bucket => bucket.name);
}

/**
 * 保存桶列表
 * @param buckets 要保存的桶列表
 */
export function saveBuckets(buckets: BucketItem[]): boolean {
  try {
    // 确保桶名称唯一
    const uniqueBuckets: BucketItem[] = [];
    const nameSet = new Set<string>();
    
    for (const bucket of buckets) {
      if (!nameSet.has(bucket.name)) {
        nameSet.add(bucket.name);
        uniqueBuckets.push(bucket);
      }
    }
    
    localStorage.setItem(BUCKET_STORAGE_KEY, JSON.stringify(uniqueBuckets));
    return true;
  } catch (error) {
    console.error('保存桶信息失败:', error);
    return false;
  }
}

/**
 * 添加新桶
 * @param bucketName 要添加的桶名称
 * @returns 是否添加成功
 */
export function addBucket(bucketName: string): boolean {
  try {
    if (!bucketName.trim()) return false;
    
    // 验证桶名称长度不超过50个字符
    if (bucketName.trim().length > 50) return false;
    
    const buckets = getAllBuckets();
    // 检查是否已存在同名桶
    if (buckets.some(b => b.name === bucketName)) {
      return false;
    }
    
    const now = new Date().toISOString();
    const newBucket: BucketItem = {
      id: generateUUID(),
      name: bucketName.trim(),
      created: now,
      updated: now
    };
    
    buckets.push(newBucket);
    return saveBuckets(buckets);
  } catch (error) {
    console.error('添加桶失败:', error);
    return false;
  }
}

/**
 * 删除桶
 * @param bucketId 要删除的桶ID
 * @returns 是否删除成功
 */
export function deleteBucket(bucketId: string): boolean {
  try {
    const buckets = getAllBuckets();
    const updatedBuckets = buckets.filter(bucket => bucket.id !== bucketId);
    
    if (updatedBuckets.length !== buckets.length) {
      return saveBuckets(updatedBuckets);
    }
    
    return false;
  } catch (error) {
    console.error('删除桶失败:', error);
    return false;
  }
}

/**
 * 通过名称删除桶（兼容旧接口）
 * @param bucketName 要删除的桶名称
 * @returns 是否删除成功
 */
export function deleteBucketByName(bucketName: string): boolean {
  try {
    const buckets = getAllBuckets();
    const updatedBuckets = buckets.filter(bucket => bucket.name !== bucketName);
    
    if (updatedBuckets.length !== buckets.length) {
      return saveBuckets(updatedBuckets);
    }
    
    return false;
  } catch (error) {
    console.error('删除桶失败:', error);
    return false;
  }
}

/**
 * 迁移旧版数据
 * 将字符串数组格式的桶名称转换为新的BucketItem对象数组
 */
export function migrateBucketData(): void {
  try {
    const bucketsJson = localStorage.getItem(BUCKET_STORAGE_KEY);
    if (!bucketsJson) return;
    
    // 尝试解析数据
    const data = JSON.parse(bucketsJson);
    
    // 检查是否为旧版数据格式（字符串数组）
    if (Array.isArray(data) && data.length > 0 && typeof data[0] === 'string') {
      const now = new Date().toISOString();
      
      // 转换为新格式
      const newBuckets: BucketItem[] = data.map((name: string) => ({
        id: generateUUID(),
        name,
        created: now,
        updated: now
      }));
      
      // 保存新格式数据
      localStorage.setItem(BUCKET_STORAGE_KEY, JSON.stringify(newBuckets));
    }
  } catch (error) {
    console.error('迁移桶数据失败:', error);
  }
} 